package com.wv.api.config;

import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.json.JSONUtil;
import com.wv.api.mapper.SysMenuDao;
import com.wv.api.mapper.SysRoleDao;
import com.wv.api.service.ISysMenuService;
import com.wv.api.service.ISysRoleService;
import com.wv.common.config.CacheService;
import com.wv.common.constant.RedisConstant;
import com.wv.model.system.SysMenu;
import com.wv.model.system.SysRole;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义权限验证接口扩展
 */
@Component    // 打开此注解，保证此类被springboot扫描，即可完成sa-token的自定义权限验证扩展
@Slf4j
public class StpInterfaceImpl implements StpInterface {

	@Autowired
	private SysMenuDao sysMenuDao;

	@Autowired
	private SysRoleDao sysRoleDao;

	@Autowired
	private CacheService cacheService;

	/**
	 * 返回一个账号所拥有的权限码集合
	 */
	@Override
	public List<String> getPermissionList(Object loginId, String loginKey) {
		// 查询缓存权限
		String s = cacheService.get(RedisConstant.USER_PERMISSION + loginId.toString());
		if (s == null){ // 如果为空，就是不存在缓存
			// 数据库查询
			List<String> collect = sysMenuDao.selectByUserId(loginId.toString()).stream().map(SysMenu::getPermission).collect(Collectors.toList());
			// 加入缓存
			cacheService.set(RedisConstant.USER_PERMISSION+loginId.toString(), JSONUtil.toJsonStr(collect));
			return collect;
		}
		// 如果缓存存在，直接返回
		return JSONUtil.parseArray(s).toList(String.class);
	}

	/**
	 * 返回一个账号所拥有的角色标识集合
	 */
	@Override
	public List<String> getRoleList(Object loginId, String loginKey) {
		// TODO: 查询登录用户的角色
		String s = cacheService.get(RedisConstant.USER_ROLE + loginId.toString());
		if (s == null){
			List<SysRole> byId = sysRoleDao.selectByUserId(loginId.toString());
			List<String> list = byId.stream().map(SysRole::getRoleName).collect(Collectors.toList());
			cacheService.set(RedisConstant.USER_ROLE+loginId.toString(),JSONUtil.toJsonStr(list));
			return list;
		}
		return JSONUtil.parseArray(s).toList(String.class);
	}
}
